import win32com.client
import os
from python_project.utils import upload_fdfs,mk_meta_data,upload_mydb
import logging
import threading

#存放本地pst的文件路径,附件落地地址，也就是附件先落地，然后再上传的一个过程。这个地址只是和附件有关系
server_root_pst_path = "D:\\temp_file\\"


def find_pst_folder(OutlookObj, pst_filepath) :
    for Store in OutlookObj.Stores :
        if Store.IsDataFileStore and Store.FilePath == pst_filepath :
            return Store.GetRootFolder()
    return None

def enumerate_folders(FolderObj,name) :
# todo 做一个判断，只是把收件箱里面的数据拿出来，这里需要设计判断，目前的判断可以实现这点
    for ChildFolder in FolderObj.Folders :
        print(ChildFolder)
        # print(ChildFolder.__dict__)
        # if ChildFolder.Name == "收件箱":
        #     singal = "收件箱"
        #     # print(ChildFolder)
        #     print("***************************************" + ChildFolder.Name)
        #     iterate_messages(ChildFolder, singal, name)
        # elif ChildFolder.Name == "已发送邮件":
        #     singal = "已发送邮件"
        #     # print(ChildFolder)
        #     print("***************************************" + ChildFolder.Name)
        #     iterate_messages(ChildFolder, singal, name)
        # elif ChildFolder.Name == "草稿":
        #     singal = "草稿"
        #     # print(ChildFolder)
        #     print("***************************************" + ChildFolder.Name)
        #     iterate_messages(ChildFolder, singal, name)
        # elif ChildFolder.Name == "已删除邮件":
        #     singal = "已删除邮件"
        #     # print(ChildFolder)
        #     print("***************************************"+ ChildFolder.Name)
        #     iterate_messages(ChildFolder, singal,name)




def iterate_messages(FolderObj,singal,pst_name) :
    """
    todo 目前这种方法，有的轮寻不出来，但是已经能解决大部分为，就这样吧，这里就不纠结了。

    :param FolderObj:
    :return:
    """
    for item in FolderObj.Items :
        print("-------------------------------------"+item.Subject)
        print(item.SenderName,1111111111)#发送者
        print(item.SenderEmailAddress,222222222)
        print(item.SentOn,3333333333) #发送时间
        print(item.To,444444444)# 收件箱的收件人，也就是当前这个人，这是他收到的文件。

        print(pst_name,55555555)
        print(item.CC,66666666) # 抄送
        print(item.BCC,77777777)
        print(item.Subject,88888888)   #主题
        print(item.Body,999999) # 邮件内容
        print(item.ReceivedTime,101010101) # 收到的时间。




        count_attachments = item.Attachments.Count # 每条message的构件数量。
        if count_attachments > 0 :
            for att in range(count_attachments) :
                #一条信息里面的每一个附件都要上传，如果有就上传，如果没有就算了
                print(item.Attachments.Item(att + 1).Filename)
                # 先把附件传上去，然后拿到地址。
                # 遍历每一个附件，先把附件落一下地



                store_path = server_root_pst_path + item.Attachments.Item(att + 1).Filename

                print(store_path)



                item.Attachments.Item(1).SaveASFile(store_path)  # Saves to the attachment to current folder
                #落地之后，然后上传到FDFS之上。


                ret = upload_fdfs(store_path)
                #
                #
                print(ret,1111111111111)
                # # 将上传后返回的信息，和条记录能够拿到的信息，一起封装好，然后发送到一人一库那面，管理起来。
                # #封装数据的时候有一个问题，有很多东西查不到。需要去数据库里面查询。
                #
                #

                dic = mk_meta_data(ret,item,singal,pst_name)

                if dic:

                    dbname = dic.get("database")
                    #
                    print(dic)
                    # #查询库名，
                    #
                    resp = upload_mydb(dic,dbname,type=" ")
                    print(resp.status_code)

                else:
                    logging.error("没有在数据库里查到{0}的信息".format(pst_name))


                os.remove(store_path)



if __name__ == "__main__":


    Outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
    #以一个文件为例子。这只是一个例子。
    # 之所以打不开，应该是没有outlook，有的话，是可以打开的。下载一个事
    #以userexecl为例，尽量先用邮件上能提供的满足，如果不能提供，难你就在想办法从别的地方获取，组织好数据，上传到库端里面去。
    # pst = "C:\\Users\\Admin\\Desktop\\readpst\\彬 王.pst"

    filename=os.listdir(r'C:\Users\Admin\Desktop\readpst')
    for pst in filename:
        print(pst)





    # pst = r"C:\Users\Admin\Desktop\readpst\测试99.pst"
        print(11111)
        Outlook.AddStore(pst)
        print(22222)
        name = "测试99"
        PSTFolderObj = find_pst_folder(Outlook,pst)
        print(33333)
    try :
        enumerate_folders(PSTFolderObj,name)
    except Exception as exc :
        print(exc)



    # def getfiles():
    #     filename=os.listdir(r'C:\Users\Admin\Desktop\readpst')
    #     return filename
    # print(getfiles())
